//初始化数据库集合的文件
const mongoose = require('mongoose')
const Schema = mongoose.Schema//使用mongoose下的Schema，它是数据库的映射
let ObjectId = Schema.Types.ObjectId//拿到数据库原生的id
const bcrypt = require('bcrypt')//密码加盐引入
const SALT_WORK_FACTOR = 10//密码加密


//创建UserShema用于初始化user集合
const userSchema = new Schema({
    UserId:ObjectId,
    username:{unique:true,type:String},//unique:true不允许跟集合的属性名重名
    password:String,
    createAt:{type:Date,default:Date.now()},
    lastLoginAt:{type:Date,default:Date.now()}

},{
    collection:'user'//强制去掉集合名称后的s
}
)


//每次存储数据时都要执行加盐加密处理
userSchema.pre('save', function(next){
    //let user = this
    console.log(this)
    bcrypt.genSalt( SALT_WORK_FACTOR,(err,salt)=>{
        if(err) return next(err)//抛出加盐错误
        bcrypt.hash(this.password,salt, (err,hash)=>{
            if(err) return next(err)//抛出加密错误
            this.password = hash
            next()
        }) 

    })
})

//从集合拿到存储的注册密码和客户输入的登录密码作比较
userSchema.methods = {
    //手写实例方法comparePassword()放入userSchema，该实例方法在user.js文件里调用。
    comparePassword:(_password,password)=>{
        //_password客户端密码，password是集合存储的密码,
        return new Promise((resolve,reject)=>{
            bcrypt.compare(_password,password,(err,isMatch)=>{
                if(!err) resolve(isMatch)
                else reject(err)
            })
        })
    }
}


//使用mongoose下的model，发布模型，（模型就是集合,只是在mongoose下用model表示）
mongoose.model('user',userSchema)//User一定要跟数据库下的集合命名相同。

